#-*- coding: utf-8 -*-

from win32event import CreateMutex
from win32api import GetLastError
from winerror import ERROR_ALREADY_EXISTS
from win32gui import FindWindow, GetSystemMenu, RemoveMenu

import subprocess
import re
import os
import ctypes

handle = CreateMutex(None, 1, 'SFCWebServer')

STD_INPUT_HANDLE = -10
STD_OUTPUT_HANDLE= -11
STD_ERROR_HANDLE = -12

FOREGROUND_BLACK = 0x0
FOREGROUND_BLUE = 0x01 # text color contains blue.
FOREGROUND_GREEN= 0x02 # text color contains green.
FOREGROUND_RED = 0x04 # text color contains red.
FOREGROUND_INTENSITY = 0x08 # text color is intensified.

BACKGROUND_BLUE = 0x10 # background color contains blue.
BACKGROUND_GREEN= 0x20 # background color contains green.
BACKGROUND_RED = 0x40 # background color contains red.
BACKGROUND_INTENSITY = 0x80 # background color is intensified.

class Color:
    ''' See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winprog/winprog/windows_api_reference.asp
    for information on Windows APIs. - www.sharejs.com'''
    std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
    
    def set_cmd_color(self, color, handle=std_out_handle):
        """(color) -> bit
        Example: set_cmd_color(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY)
        """
        bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color)
        return bool
    
    def reset_color(self):
        self.set_cmd_color(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE)
    
    def print_red_text(self, print_text):
        print print_text[0],
        self.set_cmd_color(FOREGROUND_RED | FOREGROUND_INTENSITY)
        print print_text[1],
        self.reset_color()
        print print_text[2],
        
    def print_green_text(self, print_text):
        print print_text[0],
        self.set_cmd_color(FOREGROUND_GREEN | FOREGROUND_INTENSITY)
        print print_text[1],            
        self.reset_color()
        print print_text[2],
    
    def print_blue_text(self, print_text):
        print print_text[0],
        self.set_cmd_color(FOREGROUND_BLUE | FOREGROUND_INTENSITY)
        print print_text[1],
        self.reset_color()
        print print_text[2],
          
    def print_red_text_with_blue_bg(self, print_text):
        self.set_cmd_color(FOREGROUND_RED | FOREGROUND_INTENSITY| BACKGROUND_BLUE | BACKGROUND_INTENSITY)
        print print_text,
        self.reset_color()

def disableCloseMenu():
    fullpath = r"C:\Python27\python.exe"
    WINDOW_HANDLER = FindWindow("ConsoleWindowClass", fullpath)
    CLOSE_MENU = GetSystemMenu(WINDOW_HANDLER, 0)
    SC_CLOSE = 0xF060
    RemoveMenu(CLOSE_MENU, SC_CLOSE, 0x0)
        
def daemon():
    if GetLastError(handle) != ERROR_ALREADY_EXISTS:
        clr = Color()
        
        disableCloseMenu()
        ctypes.windll.kernel32.SetConsoleCtrlHandler(None, True)

        pipe = subprocess.Popen("SFCWebServer.exe", stdout=subprocess.PIPE)
        for line in iter(pipe.stdout.readline, ''):
            if line.find('GET') > -1:
                values = line.split('GET')
                clr.print_green_text([values[0], 'GET', values[1]])
            elif line.find('POST') > -1:
                values = line.split('POST')
                clr.print_red_text([values[0], 'POST', values[1]])
            else:
                print line,

if __name__ == '__main__':
    daemon()
    